// IngenicEncoder.h
#ifndef INGENICENCODER_H
#define INGENICENCODER_H

#include <vector>
#include <mutex>
#include <atomic>
#include <cstdint>

// 君正编码器接口
class IngenicEncoder {
public:
    IngenicEncoder();
    ~IngenicEncoder();

    bool Initialize(int width, int height, int fps, int bitrate);
    bool EncodeFrame(const unsigned char* nv12Data, std::vector<unsigned char>& outputData);
    bool GetCodecConfig(std::vector<unsigned char>& outConfigBlob);
    void Shutdown();
    bool IsInitialized() const { return m_initialized; }

    // 设置编码参数
    void SetBitrate(int bitrate);
    void SetFramerate(int fps);
    void SetResolution(int width, int height);

private:
    bool CreateEncoder();
    bool SetInputType();
    bool SetOutputType();
    bool ProcessInput(const unsigned char* nv12Data);
    bool ProcessOutput(std::vector<unsigned char>& outputData);
    void ConvertNV12toH264(const unsigned char* nv12, std::vector<unsigned char>& h264);
    
    // 君正编码器实现
    bool InitializeIngenicEncoder();
    bool EncodeFrameIngenic(const unsigned char* nv12Data, std::vector<unsigned char>& outputData);
    void GenerateSPSPPS();
    void GenerateIDRFrame();
    void GeneratePFrame();

    // 成员变量
    int m_width;
    int m_height;
    int m_fps;
    int m_bitrate;
    bool m_initialized;
    std::mutex m_encoderMutex;
    
    // 编码器状态
    std::atomic<long long> m_timestamp;
    std::atomic<int> m_frameCount;
    
    // SPS/PPS数据
    std::vector<unsigned char> m_sps;
    std::vector<unsigned char> m_pps;
    bool m_spsPpsGenerated;
    
    // 编码参数
    int m_keyFrameInterval; // I帧间隔
    int m_gopSize; // GOP大小
    
    // 编码器参数
    struct {
        int profile; // H.264 profile
        int level;   // H.264 level
        int qp;      // 量化参数
        int maxQp;   // 最大量化参数
        int minQp;   // 最小量化参数
    } m_encoderParams;
};

#endif // INGENICENCODER_H
